package br.com.senac.digipao.dao;

import br.com.senac.digipao.bean.Produto;
import br.com.senac.digipao.connection.ConexaoDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ProdutoDao {

    static PreparedStatement ps;

    // a conexão com o banco de dados
    private final Connection conexao;

    public ProdutoDao() throws SQLException {
        this.conexao = new ConexaoDB().getConexao();
    }

    public void adicionaProduto(Produto produto) throws SQLException {
        // prepara a conexão
        String sql = "insert into tb_produto(id_Produto, tipoProduto, descricao, quantidade, valor) values(?,?,?,?,?)";

        try (PreparedStatement stmt = conexao.prepareStatement(sql)) {

            stmt.setInt(1, produto.getIdProduto());
            stmt.setString(2, produto.getTipoProduto());
            stmt.setString(3, produto.getDescricao());
            stmt.setString(4, produto.getQuantidade());
            stmt.setString(5, produto.getValor());

            //Executa o código SQL
            stmt.execute();
            stmt.close();
        }
    }

    public void alteraProduto(Produto produto) throws SQLException {
        String sql = "update tb_produto set tipoProduto = ? , descricao = ? , quantidade = ? , valor = ? where id_Produto = ? ";

        try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
            
            stmt.setString(1, produto.getTipoProduto());
            stmt.setString(2, produto.getDescricao());
            stmt.setString(3, produto.getQuantidade());
            stmt.setString(4, produto.getValor());
            stmt.setInt(5, produto.getIdProduto());
            //executar a query
            stmt.execute();
            stmt.close();
        }
    }

    public List<Produto> listaProdutoPorParametros(String parametro) throws SQLException {
        // prepara a conexão
        boolean duplicado = false;
        List<Produto> listaProduto = new ArrayList<>();

        String sql = "select * from tb_produto where tipoProduto LIKE '%" + parametro + "%'";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            duplicado = false;
            Produto produto = new Produto();
            produto.setIdProduto(rs.getInt("id_Produto"));
            produto.setTipoProduto(rs.getString("tipoProduto"));
            produto.setDescricao(rs.getString("descricao"));
            produto.setQuantidade(rs.getString("quantidade"));
            produto.setValor(rs.getString("valor"));
            listaProduto.add(produto);
        }

        sql = "select * from tb_produto where descricao LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            duplicado = false;
            for (int i = 0; i < listaProduto.size(); i++) {
                if (listaProduto.get(i).getIdProduto() == rs.getInt("id_Produto")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Produto produto = new Produto();
                produto.setIdProduto(rs.getInt("id_Produto"));
                produto.setTipoProduto(rs.getString("tipoProduto"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setQuantidade(rs.getString("quantidade"));
                produto.setValor(rs.getString("valor"));
                listaProduto.add(produto);
                duplicado = false;
            }
        }

        sql = "select * from tb_produto where quantidade LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            duplicado = false;
            for (int i = 0; i < listaProduto.size(); i++) {
                if (listaProduto.get(i).getIdProduto() == rs.getInt("id_Produto")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Produto produto = new Produto();
                produto.setIdProduto(rs.getInt("id_Produto"));
                produto.setTipoProduto(rs.getString("tipoProduto"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setQuantidade(rs.getString("quantidade"));
                produto.setValor(rs.getString("valor"));
                listaProduto.add(produto);
                duplicado = false;
            }
        }

        sql = "select * from tb_produto where valor LIKE '%" + parametro + "%'";

        preparedStatement = conexao.prepareStatement(sql);
        rs = preparedStatement.executeQuery(sql);

        while (rs.next()) {
            duplicado = false;
            for (int i = 0; i < listaProduto.size(); i++) {
                if (listaProduto.get(i).getIdProduto() == rs.getInt("id_Produto")) {
                    duplicado = true;
                    break;
                }
            }
            if (!duplicado) {
                Produto produto = new Produto();
                produto.setIdProduto(rs.getInt("id_Produto"));
                produto.setTipoProduto(rs.getString("tipoProduto"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setQuantidade(rs.getString("quantidade"));
                produto.setValor(rs.getString("valor"));
                listaProduto.add(produto);
                duplicado = false;
            }
        }

        return listaProduto;
    }

    public Produto buscaProdutoPorId(int id) throws SQLException {

        String sql = "select * from tb_produto where id_Produto = " + id + " LIMIT 1";

        PreparedStatement preparedStatement = conexao.prepareStatement(sql);
        ResultSet rs = preparedStatement.executeQuery(sql);

        Produto produto = new Produto();

        while (rs.next()) {
            produto.setIdProduto(rs.getInt("id_Produto"));
            produto.setTipoProduto(rs.getString("tipoProduto"));
            produto.setDescricao(rs.getString("descricao"));
            produto.setQuantidade(rs.getString("quantidade"));
            produto.setValor(rs.getString("valor"));
        }

        return produto;
    }

    public void excluiProdutoPorId(int id) {
        String sql = "delete from tb_produto where id_Produto = " + id;

        try {
            PreparedStatement stmt = this.conexao.prepareStatement(sql);
            stmt.execute();
            stmt.close();
        } catch (SQLException ex) {
            Logger.getLogger(ProdutoDao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
